# -*- coding: utf-8 -*-
"""
@Time ： 2021/4/26 0:54
@Auth ： Mr. royalday 2487625775
@Company ： 2487625775@qq.cpm
@Function ：请输入模块功能描述
"""
from datetime import datetime

from django.db import transaction
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
from django.conf import settings
from web import models


class Tracer(object):
    def __init__(self):
        self.user = None
        self.price_policy = None
        self.project = None


class AuthMiddleware(MiddlewareMixin):

    def process_request(self, request):
        """
        中间件，每次发起请求后执行
        如果用户登录成功，就在request中新增一个key，保存用户对象
        :param request:
        :return:
        """
        request.tracer = Tracer()

        user_id = request.session.get('user_id', 0)  # 如果找不到，设置值为0
        user_object = models.UserInfo.objects.filter(id=user_id).first()
        request.tracer.user = user_object

        # 视图白名单：不需要登录就可以访问的页面
        """
        1、获取当前用户访问的url
        2、检查url是否在白名单中，如果在则可以继续向后访问，如果不在则进行判断是否已经登录
        """
        print(request.path_info)
        if request.path_info in settings.WHITE_REGEX_URL_LIST:
            # 检查用户是否已经登录，已经登录继续往后走
            return
        if not request.tracer.user:
            return redirect("web:login")

        # 登录成功后，访问后台管理时：获取当前用户所拥有的额度
        # 获取当前用户最近的一次已支付的交易记录（id最大)
        _object = models.Transaction.objects.filter(user=user_object, status=2).order_by('-id').first()
        # 判断交易记录是否存在，并且是否已过期
        current_datetime = datetime.now()
        if _object.end_datetime and _object.end_datetime < current_datetime:
            _object = models.Transaction.objects.filter(user=user_object, status=2, price_policy__category=1).first()
        request.tracer.price_policy = _object.price_policy

    @transaction.atomic
    def process_view(self, request, view, args, kwargs):
        """
        中间件，每次发起请求后执行，达到视图前执行
        :param request:
        :param view:
        :param args:
        :param kwargs:
        :return:
        """
        # 通过url开头判断请求url是否是项目主页
        if not request.path_info.startswith('/manage/'):
            return

        project_id = kwargs.get('project_id')

        # 判断项目是否是我创建的
        project_object = models.Project.objects.select_for_update().filter(creator=request.tracer.user,
                                                                           id=project_id).first()
        if project_object:
            # 是我创建的项目的话，就让他通过，并将项目对象添加到request中
            request.tracer.project = project_object
            return
        # 判断项目是否是我参与的
        project_join_object = models.ProjectUser.objects.filter(user=request.tracer.user, id=project_id).first()
        if project_join_object:
            # 是我参与的项目的话，就让他通过, 并将项目对象添加到request中
            request.tracer.project = project_join_object.project
            return

        # 如果都不符合，重定向到项目列表页面
        return redirect('web:project_list')
